package main

import "fmt"

func main() {
	/*
		1.一维数组：存在的多个数据是数值本身
			a1 := [3]int{1,2,3}
		2.二维数组：存储的是一维的一维
			a2 := [3][4]int{{},{},{}}

			该二维数组的长度，就是 3
			存储的元素是一维数组，一维数组的元素是数值，每个一维数组长度为 4。

		3.多维数组：。。。

		注：多维数组只有 第一层 可以使用 "..." 来让编译器推导数组长度。

	*/
	a2 := [3][4]int{{1, 2, 3}, {2, 4, 5, 7}, {1, 2}}
	fmt.Println(a2)
	fmt.Printf("二维数组的地址：%p，长度：%d\n", &a2, len(a2))
	fmt.Printf("二维数组所指向的一维数组的长度：%d\n", len(a2[0]))

	fmt.Printf("%T, %v\n", a2[0], a2[0]) //[4]int, [1 2 3 0]

	//for 循环遍历二维数组
	for i := 0; i < len(a2); i++ {
		for j := 0; j < len(a2[0]); j++ {
			fmt.Print(a2[i][j], "\t")
		}
		fmt.Println()
	}

	fmt.Println("------------------------")
	//for range 遍历二维数组
	for _, arr := range a2 {
		for _, value := range arr {
			fmt.Print(value, "\t")
		}
		fmt.Println()
	}

	fmt.Println("-----------make创建二维数组------------")
	row, column := 5, 5
	//1.先初始化一个二维数组，数组为 row 行，每行存储一个切片，具体大小先不定
	res := make([][]int, row)
	//2.然后再为每行申请一个 column 大小的数组放入
	for i := 0; i < row; i++ {
		res[i] = make([]int, column)
	}
	fmt.Printf("%T\n", res)
	for _, r := range res {
		for _, i := range r {
			i = 0
			fmt.Print(i, " ")
		}
		fmt.Println()
	}

	//多维数组只有第一层可以使用 "..." 来让编译器推导数组长度。
	//支持的写法：
	a := [...][2]string{
		{"北京", "上海"},
		{"南京", "深圳"},
		{"西安", "洛阳"},
	}
	fmt.Println(a)

	//b := [3][..]string{
	//	{"北京", "上海"},
	//	{"南京", "深圳"},
	//	{"西安", "洛阳"},
	//}
	//fmt.Println(b)

}
